
package Translate;

import javax.swing.*;
import javax.swing.plaf.FontUIResource;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
import java.util.List;

/**
 * Creat with IntelliJ IDEA
 * Description: 中译英界面实现
 * Date:2021-12-06
 * Time:16:34
 */
public class Translate extends JFrame implements ActionListener {//中译英界面类

    Box baseBox, box1, box2, box3, box4;//盒式布局容器
    JTextArea input, translate1, translate2, translateCompare;//文本框
    Font font = new Font("Dialog",0,17);//设置默认字体

    public Translate(){//构造方法
        InitGlobalFont(this.font);//调用InitGlobalFont()方法设置全局字体 - 避免重复设置字体
        this.setTitle("中译英翻译窗口");//设置窗口标题
        baseBox = Box.createVerticalBox();//创建一个列型盒式布局容器，作为基容器


        //对第一块进行布局
        box1 = Box.createHorizontalBox();//创建一个行型盒式布局容器
        box1.add(new JLabel("中文："));//添加标签 - 内容初始化为"中文："

        //创建一个输入文本框，初始化内容和文本框的行和列
        input = new JTextArea("请在这里输入要翻译的中文",4,30);
        input.setLineWrap(true);//设置该文本框自动换行
        //创建一个滚动窗格，并把输入文本框放到滚动窗格中
        JScrollPane j1 = new JScrollPane(input);
        box1.add(j1);//在box1中添加滚动窗格

        JButton button = new JButton("翻译");//创建一个按钮，内容初始化为“翻译”
        button.addActionListener(this);//在“翻译”按钮上添加监视器
        box1.add(button);//将按钮添加到box1中

        baseBox.add(box1);//将box1添加到基容器中
        baseBox.add(Box.createVerticalStrut(20));//设置垂直支撑高度为20


        //对第二块进行布局
        box2 = Box.createHorizontalBox();//创建一个行型盒式布局容器
        box2.add(new JLabel("百度翻译："));//添加标签 - 内容初始化为"百度翻译："

        translate1 = new JTextArea(4,30);//创建一个翻译文本框，初始化文本框的行和列
        translate1.setLineWrap(true);//设置该文本框自动换行
        translate1.setWrapStyleWord(true);//设置该文本框以单词为界换行
        JScrollPane j2 = new JScrollPane(translate1);//创建一个滚动窗格，并把文本框放到滚动窗格中
        box2.add(j2);//在box2中添加滚动窗格

        baseBox.add(box2);//将box2添加到基容器中
        baseBox.add(Box.createVerticalStrut(20));//设置垂直支撑高度为20


        box3 = Box.createHorizontalBox();//创建一个行型盒式布局容器
        box3.add(new JLabel("讯飞翻译："));//添加标签 - 内容初始化为"讯飞翻译："

        translate2 = new JTextArea(4,30);//创建一个翻译文本框，初始化文本框的行和列
        translate2.setLineWrap(true);//设置该文本框自动换行
        translate2.setWrapStyleWord(true);//设置该文本框以单词为界换行
        JScrollPane j3 = new JScrollPane(translate2);//创建一个滚动窗格，并把文本框放到滚动窗格中
        box3.add(j3);//在box3中添加滚动窗格

        baseBox.add(box3);//将box3添加到基容器中
        baseBox.add(Box.createVerticalStrut(20));//设置垂直支撑高度为20

        box4 = Box.createHorizontalBox();//创建一个行型盒式布局容器
        box4.add(new JLabel("翻译比较："));//添加标签 - 内容初始化为"翻译比较："

        translateCompare = new JTextArea(4,30);//创建一个比较翻译结果的文本框，初始化文本框的行和列
        translateCompare.setLineWrap(true);//设置该文本框自动换行
        translateCompare.setWrapStyleWord(true);//设置该文本框以单词为界换行
        JScrollPane j4 = new JScrollPane(translateCompare);//创建一个滚动窗格，并把文本框放到滚动窗格中
        box4.add(j4);//在box4中添加滚动窗格
        baseBox.add(box4);//将box4添加到基容器中

        add(baseBox);//将基容器添加到窗口中
        validate();
        setBounds(100, 100, 600, 500);//设置窗口位置及大小
        setVisible(true);//设置窗口可见
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//默认关闭即退出

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String str = input.getText();//获取输入框中的内容
        String ret = Main.trans(str);//调用Main方法 - 获取百度翻译的结果
        String tmp = "";//空字符串 - 用于存放百度翻译结果
        StringTokenizer token = new StringTokenizer(ret,"\"}]}");//分词器 - 对ret字符串进行分割
        while(token.hasMoreTokens()){
            tmp = token.nextToken();
        }
        translate1.setText(tmp);//将得到的翻译结果放到translate1文本框中

        try {
            boolean flg = false;//标志变量 - 用于标识是否已经得到想要的字符串，默认为否
            String ret2 = WebITS.trans2(str);//调用WebITS类中的静态方法——main方法 - 获取科大讯飞翻译的结果
            token = new StringTokenizer(ret2,":\"");//对ret2字符串进行分割
            while(token.hasMoreTokens()){
                tmp = token.nextToken();
                if(flg==true){//说明已经得到想要的内容，break
                    break;
                }
                if(tmp.equals("dst")){//当获取到“dst”时，说明下一个内容就是我们要的翻译结果
                    flg = true;//将flg标记为true
                }
            }
            translate2.setText(tmp);//将得到的翻译内容放到translate2文本框中
        } catch (Exception ex) {//调用WebITS类的main方法可能抛出异常，因此需要用try-catch包围代码
            ex.printStackTrace();
        }
        //调用compare()方法比较两个翻译结果的，将相同的内容放到translateCompare文本框中
        translateCompare.setText(compare(translate1.getText(),translate2.getText()));
    }

    private String compare(String str1, String str2){//用于比较两个字符串中相同的单词，区分大小写
        if (str1.equals(str2)){//当两个字符串完全相同时
            return str1;
        }
        //对str1进行分割，将分割得到的每个单词放到一个List中，再将其与str2一一比较
        StringTokenizer tokenizer = new StringTokenizer(str1," ,.;'?!");
        List<String> word = new ArrayList<>();
        String ret = "";
        while (tokenizer.hasMoreTokens()){
            word.add(tokenizer.nextToken());
        }
        for (String s: word) {
            if (str2.contains(s)){//如果str2中包含word中的单词（区分大小写）
                ret += s+" ";//则将该单词放入ret中
            }
        }
        return ret;//返回ret
    }

    //修改swing全局字体 - 在main方法中生成其他GUI图形界面之前调用，可以将字体设置为我们传参的字体
    public static void InitGlobalFont(Font f){
        FontUIResource fontRes = new FontUIResource(f);
        for (Enumeration<Object> keys = UIManager.getDefaults().keys(); keys.hasMoreElements();) {
            Object key = keys.nextElement();
            Object value = UIManager.get(key);
            if (value instanceof FontUIResource) {
                UIManager.put(key, fontRes);
            }
        }
    }

    public static void main(String[] args) {
        Translate t = new Translate();//创建一个中译英翻译窗口对象
    }
}
